/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Arbori;

/**
 *
 * @author AlinT
 */

import Visitor.*;
/**
 * structura de date folosita pentru a repreznta o functie algebrica este
 * de arbore binar,unde frunzele arborelui reprezinta functia identica,
 *  nodurile cu doi fii reprezinta operatori aritmetici elementari
 *  iar nodurile cu un singur fiu functii matematice elementare
 *  (putere,logaritm,sin, etc.).
 *  clasa Nod va fi clasa parinte pentru clasele Operator si Functie.
 *  Atributele clasei sunt de tipul protected:
 *  fStang-variabila de tipul Nod reprezentand fiul stang al nodului
 *  fDrept-reprezinta fiul drept al nodului
 *  variabila x de tipul double este folosit pentru a memora argumentul
 *   functiei folosit la diferite calcule non simbolice.
 *
 */
public class Nod {
	protected Nod fStang;
	protected Nod fDrept;
	protected double x;
        protected int contor;
        /**
         * Constructor implicit
         */
        /*@
         * assignable contor
         * assignable fStang
         * assignable fDrept
         * ensures contor=0
         * ensures fStang==null
         * ensures fDrept==null
         @*/
        public Nod(){
            this.contor=0;
            fStang=null;
            fDrept=null;
        }
        /**
         *
         * @param c initializeaza contorul
         */
        public void setContor(int c){
            contor=c;
        }
        /**
         *
         * @return valoarea contorului
         */
        public int getContor(){
            return contor;
        }
        
	/**
	 * functia getfStang este folosita pentru a obtine valoarea fiului stang
	 * al unui nod
	 * @return returneaza o variabila de tipul Nod reprezentand subarborele
	 * stang
	 */
	public Nod getfStang() {
		return fStang;
	}
	/**
	 * functia setfStang este folosita pentru a seta valoarea fiului stang
	 * al unui nod
	 * @param fStang variabila de tipul Nod transmisa ca parametru reprezinta
	 * valoarea fiului stang al nodului
	 */
	public void setfStang(Nod fStang) {
		this.fStang = fStang;
	}
	/**
	 * functia getfDrept este folosita pentru a obtine valoarea fiului drept
	 * al unui nod
	 * @return returneaza o variabila de tipul Nod reprezentand subarborele
	 *  drept
	 */
	public Nod getfDrept() {
		return fDrept;
	}
	/**
	 * functia setfDrept este folosita pentru a seta valoarea fiului drept
	 * al unui nod
	 * @param fDrept variabila de tipul Nod transmisa ca parametru reprezinta
	 * valoarea fiului drept al nodului
	 */
	public void setfDrept(Nod fDrept) {
		this.fDrept = fDrept;
	}
	/**
	 * metoda getX() se foloseste pt a obtine valoarea atributui X
	 * @return returneaza o variabila de tip double
	 */
	public double getX() {
		return x;
	}
        //@ requires this.fDrept!==null
        //@ requires this.fStang!==null
	/**
	 * la setarea atributului x al unui nod sa se seteze cu aceeasi valoare
	 * si nodurile fiu (! Se va testa existenta nodului fiu si apoi se va
	 * seta valoarea acestuia).
	 * @param x primeste ca argument o variabila de tipul double
	 */
	public void setX(double x) {
		this.x = x;
		if(this.fDrept!=null)
			this.fDrept.x=x;
		if(this.fStang!=null)
			this.fStang.x=x;
	}
        /**
         *  Functia ce accepta visitorul specificat de parametru
         * @param v visitorul ce va fi acceptat de catre nod
         */
        public void acceptVisitor(Visitor v){
            v.visit(this);
        }


}

